package com.ikas.autumn.iec104.module.iec.apdunew;

public class Telemetry {
    private Telemetry() {
    }
    /**
     * 归一化值
     */
    public static float bytes2FloatNva(int low, int high) {
        float fVal;
        int nva = (high << 8) + low;
        // 符号位1位，0为正数，1为负数，后面的为补码表示，
        // 正数的补码和原码相同不需要转换。对于负数,先取反码再加1得到补码的补码，就是原码了。
        //符号位：0表示正数，1表示负数
        int symbol = (high & 0x80);
        if (symbol == 0x80) {
            //  (nva ^ 0xffff) + 1 :补码的补码  ，取出后面的15位数据乘上-1得到值
            fVal = -1f * (((nva ^ 0xffff) + 1) & 0x7fff);
        } else {
            fVal = nva;
        }
        //这里的32767值的是一个量纲，一般这个参数是主站和从站商定的
        return fVal / 32767;
    }

    /**
     * 标度化值
     */
    public static float bytes2FloatSva(int low, int high) {
        float fVal;
        int nva = (high << 8) + low;
        //0表示正数，1表示负数
        int symbol = (high & 0x80);
        if (symbol == 0x80) {
            fVal = -1f * (((nva ^ 0xffff) + 1) & 0x7fff);
        } else {
            fVal = nva;
        }
        return fVal;
    }

    /**
     * 短浮点数
     *
     * @param data 从低位到高位按顺序
     * @return
     */
    public static float bytes2FloatIeee754(String data) {

        return Float.intBitsToFloat(Integer.valueOf(data, 16));
    }

}


